﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////


#pragma once

#include "GcmpUiInterface.h"
#include "IWidget.h"
#include "ElementId.h"

namespace gcmp
{

    class IPropertyPanelEvent;
    class IDocManager;

    /// \brief 属性面板部件
    ///
    /// 这里的部件是不含“浮动”行为的属性面板，浮动行为请参考IDock
    /// \see IDock
    class GCMP_UI_INTERFACE_EXPORT IPropertyWidget : public IWidget
    {
    public:
        /// \brief 析构器
        virtual ~IPropertyWidget();

    public:
        /// \brief 刷新属性面板
        /// \param bRebuild 是否重新构造属性表子窗口
        virtual void Refresh(bool bRebuildPropertyWidget) = 0;

        /// \brief 刷新属性面板
        ///
        /// 会重新设置预设参数， 并重新构造属性表子窗口
        virtual void RefreshAll() = 0;

        /// \brief 获取属性面板发出事件的句柄
        ///
        /// 当需要关注属性面板的变化时，比如通过属性面板修改值、类型等操作时
        /// 需要监听该句柄。当前发出的事件可参照 \see IPropertyPanelEventArgs
        ///
        /// \return gcmp::IPropertyPanelEvent  属性面板事件句柄
        virtual gcmp::IPropertyPanelEvent* GetInputEvent() = 0;

        virtual void SetDefaultElementId(const gcmp::ElementId& idDefaultElement) = 0;

        //////////////////////////////////////////////////////////////////////////
        // TODO:建议去掉，属性表不应该知道预设参数  2020-03-20 zhoudc
        /// \brief 设置预设对象Id
        /// \param elementId 预设对象Id
        virtual void SetPreSetElementId(const gcmp::ElementId& elementId) = 0;

        /// \brief 获取预设对象Id
        /// \param ElementId 预设对象Id
        virtual const gcmp::ElementId GetPreSetElementId() const = 0;
        //////////////////////////////////////////////////////////////////////////

        virtual std::wstring GetComponentTypeChangedEventId() const = 0 ;

        virtual std::wstring GetComponentTypeModifiedPropertyEventId() const = 0;   

    public:
        /// \brief 获取属性窗口默认类型名称
        /// \return std::wstring 返回默认属性窗口名称
        static std::wstring GetTypeName();

        /// \brief 得到当前的项目的属性面板
        /// \return IPropertyPalette*
        static IPropertyWidget* GetPropertyWidget();
    };
}
